package com.czl.myRabbitMq.mqServer.core;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.*;

import java.util.HashMap;
import java.util.Map;

//消息队列交换机
@Data
@ToString
public class Exchange {

    //交换机名字(唯一标识符)
    private String name;
    //交换机类型
    private ExchangeType exchangeType = ExchangeType.DIRECT;
    //交换机是否可持久化
    private boolean durable = false;
    //当前交换机没人使用后是否自动删除
    //POJO 类中的任何布尔类型的变量，都不要加 is 前缀，否则部分框架解析会引起序列
    //化错误 by-阿里开发手册
    private boolean isAutoDelete = false;

    //创建交换机时其他选项
    //关系型数据库创建时不支持map类型 所以数据库中 将map类型改为 json格式的字符串

    private Map<String,Object> params = new HashMap<>();

    public Map<String, Object> getParamsMap(){
        return this.params;
    }
    public String getParams(){
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            return objectMapper.writeValueAsString(this.params);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * ‘这一段要是读不懂去瞅瞅MSQQueue那个类的说明
     * @param params
     */
    public void setParams(String params){
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            this.params = objectMapper.readValue(params, new TypeReference<HashMap<String,Object>>() {});
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
    }
    public void setParams(Map<String, Object> params){
        this.params = params;
    }


    /**
     * 这里我们在提供一组get和set方法 目的是为了在测试代码中 直接构造params中的参数
     */
    public Object testGetParams(String key){
        return params.get(key);
    }
    public void testSetParams(String key, Object Value){
        params.put(key,Value);
    }
}
